/**************************************************************************//**
 * @item     CosyOS-II Kernel
 * @file     sv_int_loc.h
 * @brief    中断本地服务（仅在用户中断中调用，并在本地执行）
 * @author   迟凯峰
 * @version  V1.0.0
 * @date     2023.10.20
 ******************************************************************************/

#ifndef __SV_INT_LOC_H
#define __SV_INT_LOC_H

m_fetion_t si_recv_fetion(m_fetion_t _OBJ_MEM_ *ft);
#if SYSCFG_MCUCORE == 8051
s_bool_t   si_can_read_gmbox(void _OBJ_MEM_ *gm);
s_bool_t   si_can_read_lmbox(void);
void      *si_get_lmbox(void);
s_bool_t   si_can_access_msgqueue(s_msgqueue_tsp queue);
#else
s_bool_t   si_recv_mail(void *lm, void *gm, size_t size, s_bool_t *gf) MCUCFG_251_REENTRANT;
void      *si_read_gvar(void *gv);
#endif
void      *si_recv_msg (s_msgqueue_tsp queue);



/*
 * 二值信号量（获取）
 */

#define sISV_TakeBin(bin) \
( \
	bin ? bin-- : bin \
)



/*
 * 飞信（接收飞信）
 */

#define sISV_RecvFetion(tbox) \
( \
	tbox ? si_recv_fetion(&tbox) : false \
)



/*
 * 消息邮箱（接收邮件）
 */
#if SYSCFG_MCUCORE == 8051
#if SYSCFG_MAILBOX_ACCESSMECHANISM == 0
#define sISV_RecvMail(mail, mbox) \
( \
	si_can_read_gmbox(&mbox) \
	? mbox##_gnmf \
		? s_memcpy(mail, &mbox, sizeof(mbox)) || true \
			? mbox##_gnmf-- \
			: mbox##_gnmf-- \
		: false \
	: false \
)

#elif SYSCFG_MAILBOX_ACCESSMECHANISM == 1
#define sISV_RecvMail(mail, mbox) \
( \
	si_can_read_gmbox(&mbox) \
	? mbox##_gnmf \
		? s_memcpy(mail, &mbox, sizeof(mbox)) || true \
			? mbox##_gnmf-- \
			: mbox##_gnmf-- \
		: false \
	: si_can_read_lmbox() \
		? s_memcpy(mail, si_get_lmbox(), sizeof(mbox)) || true \
			? true \
			: true \
		: false \
)

#endif
#else
#define sISV_RecvMail(mail, mbox) \
	si_recv_mail(mail, &mbox, sizeof(mbox), &mbox##_gnmf)

#endif



/*
 * 消息队列（接收消息）
 */
#if SYSCFG_MCUCORE == 8051
#define	sISV_RecvMsg(que) \
( \
	si_can_access_msgqueue(que) ? si_recv_msg(que) : NULL \
)
#else
#define	sISV_RecvMsg(que) \
	si_recv_msg(que)
#endif



/*
 * 事件标志组
 */

 /* 查询标志组 */
#define	sISV_QueryFlagGroup(group) \
( \
	  sizeof(group) == 1 ? *(s_u8_t  *)&group ? true : false \
	: sizeof(group) == 2 ? *(s_u16_t *)&group ? true : false \
	: sizeof(group) == 4 ? *(s_u32_t *)&group ? true : false \
	: false \
)



/*
 * 全局变量
 */
#if SYSCFG_MCUCORE == 8051
#define si_read_gvar(gp) \
( \
	s_sign_write_gvar_accessor \
 || s_gvar_accessor == NULL || s_gvar_accessor->gv != (void *)gp \
	? gp \
	: s_gvar_accessor->lv \
)
#endif
/* 读全局变量 */
#define sISV_ReadGVar(gv, type) \
	*(type *)si_read_gvar(&gv) \

/* 读全局数组 */
#define sISV_ReadGAry(lp, gp, size) \
	s_memcpy(lp, si_read_gvar(gp), size) \

/* 读全局字符串 */
#define sISV_ReadGStr(ls, gs) \
	s_strcpy(ls, (char *)si_read_gvar(gs)) \



#endif
